package com.team.order.utils;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.Map;
import java.util.TreeMap;

/**
 * 支付工具类
 * @author 梁国瑞
 */
@Slf4j
@Component
public class PaymentUtil {
    
    @Autowired
    private MockPaymentSDK mockPaymentSDK;
    
    /**
     * 生成支付签名
     * @param params 参数
     * @param secretKey 密钥
     * @return 签名
     */
    public static String generateSign(Map<String, String> params, String secretKey) {
        // 按参数名排序
        TreeMap<String, String> sortedParams = new TreeMap<>(params);
        
        // 构建签名字符串
        StringBuilder signStr = new StringBuilder();
        for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
            if (StrUtil.isNotBlank(entry.getValue()) && !"sign".equals(entry.getKey())) {
                signStr.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
        }
        signStr.append("key=").append(secretKey);
        
        // MD5加密
        return DigestUtil.md5Hex(signStr.toString()).toUpperCase();
    }
    
    /**
     * 验证支付签名
     * @param params 参数
     * @param secretKey 密钥
     * @param sign 签名
     * @return 验证结果
     */
    public static boolean verifySign(Map<String, String> params, String secretKey, String sign) {
        String generatedSign = generateSign(params, secretKey);
        return generatedSign.equals(sign);
    }
    
    /**
     * 生成微信支付参数（使用模拟SDK）
     * @param orderNo 订单号
     * @param amount 金额（分）
     * @param description 商品描述
     * @return 支付参数
     */
    public Map<String, String> generateWechatPayParams(String orderNo, Integer amount, String description) {
        log.info("使用模拟SDK生成微信支付参数，订单号：{}，金额：{}", orderNo, amount);
        
        // 将分转换为元
        BigDecimal amountYuan = new BigDecimal(amount).divide(new BigDecimal("100"));
        
        // 调用模拟SDK
        return mockPaymentSDK.createWechatPayOrder(orderNo, amountYuan, description);
    }
    
    /**
     * 生成支付宝支付参数（使用模拟SDK）
     * @param orderNo 订单号
     * @param amount 金额
     * @param subject 商品标题
     * @return 支付参数
     */
    public Map<String, String> generateAlipayParams(String orderNo, String amount, String subject) {
        log.info("使用模拟SDK生成支付宝支付参数，订单号：{}，金额：{}", orderNo, amount);
        
        // 调用模拟SDK
        return mockPaymentSDK.createAlipayOrder(orderNo, new BigDecimal(amount), subject);
    }
    
    /**
     * 模拟支付成功
     * @param orderNo 订单号
     * @return 是否成功
     */
    public boolean simulatePaymentSuccess(String orderNo) {
        return mockPaymentSDK.simulatePaymentSuccess(orderNo);
    }
    
    /**
     * 模拟支付失败
     * @param orderNo 订单号
     * @return 是否成功
     */
    public boolean simulatePaymentFail(String orderNo) {
        return mockPaymentSDK.simulatePaymentFail(orderNo);
    }
    
    /**
     * 查询支付状态
     * @param orderNo 订单号
     * @return 支付状态
     */
    public String queryPaymentStatus(String orderNo) {
        return mockPaymentSDK.queryPaymentStatus(orderNo);
    }
    
    /**
     * 模拟退款
     * @param orderNo 订单号
     * @param amount 退款金额
     * @return 是否成功
     */
    public boolean refund(String orderNo, BigDecimal amount) {
        return mockPaymentSDK.refund(orderNo, amount);
    }
    
    /**
     * 验证回调签名（使用模拟SDK）
     * @param params 参数
     * @param secretKey 密钥
     * @param sign 签名
     * @return 验证结果
     */
    public boolean verifyCallbackSign(Map<String, String> params, String secretKey, String sign) {
        return mockPaymentSDK.verifyCallbackSign(params, sign);
    }
    
    /**
     * 清除所有模拟数据
     */
    public void clearAllData() {
        mockPaymentSDK.clearAllData();
    }
    
    /**
     * 生成随机字符串
     * @return 随机字符串
     */
    private static String generateNonceStr() {
        return java.util.UUID.randomUUID().toString().replace("-", "").substring(0, 32);
    }
} 